//
//  CZStatusViewModel.swift
//  Weibo24
//
//  Created by apple on 16/3/1.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit

class CZStatusViewModel: NSObject {

    // ViewModel里放 model
    var statusModel: CZStatusModel?
    /// 用户认证图像
    /// 认证类型 -1：没有认证，0，认证用户，2,3,5: 企业认证，220: 达人
    /// verified_type
    var verifity_image: UIImage? {
    
        
        switch statusModel?.user?.verified_type ?? -1 {
        
        case -1: return nil
        case 0: return UIImage(named: "avatar_vip")
        case 2,3,5: return UIImage(named: "avatar_enterprise_vip")
        case 220: return UIImage(named: "avatar_grassroot")
            
            //switch语言需要加默认的 default
        default: return nil
        }
        
    }
    
    var level_image: UIImage? {
        
//        print(statusModel?.user?.mbrank)
        //为什么是可选项的 Optional(2)
        return UIImage(named: "common_icon_membership_level\(statusModel?.user?.mbrank ?? 0)")
        
    }
    
    
    // 转发按钮文字的逻辑
    var retweetString: String? {
    
        //当转发数量为0 的时候,显示文字
        //当转发数量不为0 的时候,显示数字
        if statusModel?.reposts_count == 0 {
            return "转发"
        } else {
            if let str = statusModel?.reposts_count{
                return "\(str)"
            }
            return "转发"
        }
        
    }
    
    //评论
    var commentString: String?
    
    //转发微博的内容
    var retweetStatusString: String? {
    
            return statusModel?.retweeted_status?.text
    }
    
    func dealSource(sourceString: String?) -> String?{
    
        //进行一个判断, sourceString不能为空
        guard let source = sourceString else {
        
            return nil
            
        }
        // componentsSeparatedByString 就是根据 传递的 一个字符,进行字符串的一个分割
        // 分割字符串 - >
        let sourceArray = source.componentsSeparatedByString(">")
        
        // 严谨一定要考虑到其他的因素
        if sourceArray.count >= 2{
        
            let subSource = sourceArray[1]
            
            // 分割字符串 - <
            let lastSourceArray = subSource.componentsSeparatedByString("<")
            
            if lastSourceArray.count >= 1 {
                return lastSourceArray.first
            } else {
                return nil
            }
            
        } else {
            return nil
        }
        
        
        
        
        
    }
    
    
    func dealCreateDate(create_date: String?) -> String?{
    
        // 判断
        guard let createDate = create_date else {
            return nil
        }
        
        // 把 Optional("Thu Mar 03 17:00:03 +0800 2016")时间转换成标准时间

        
        let formatter = NSDateFormatter()
        
        //设置时区,注意
        formatter.locale = NSLocale(localeIdentifier: "cn")
        /*
        设置日期格式 （声明字符串里面每个数字和单词的含义）
        E：星期
        M: 月份
        d：日
        H: 24小时
        m: 分
        s: 秒
        y: 年
        Zone -> Z
        */
        formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
        
        let date = formatter.dateFromString(createDate)
        
        printLog(date)
        // 2016-03-03 09:13:09 +0000
        // 2016-04-03 09:13:09 +0000
       /*
            日历可以对时间进行比较
        
        显示逻辑
        
        如果是今年
        
        是今天
        
                1分钟之内 显示 "刚刚"
                
                1小时之内 显示 "xx分钟前"
                
                其他 显示 "xx小时前"
            
            是昨天 显示 "昨天 HH:mm"
            
            其他 显示 "MM-dd HH:mm"
        
        不是今年 显示 "yyyy-MM-dd"
        */
        
        /*
            面试的时候,会被问到 -- 列举一下你经常使用的单例
            NSUserDefaults
            UIApplication
            NSBundle.mainBundle()
            NSURLSession.sharedSession()
            NSFileManager.defaultManager()
            NSNotificationCenter.defaultCenter()
            NSCalendar.currentCalendar()
        */
        
        //1.获取一个当前的日历
        let calendar = NSCalendar.currentCalendar()
        //2.设置要获取的比较 年/月/日/时/分/秒/ 枚举
        /*
            OC选取多个枚举的时候 | 
            Swift 选取多个枚举的时候 arrayLiteral:
        */
        let unites = NSCalendarUnit(arrayLiteral: .Year,.Month,.Day,.Hour,.Minute)
        
        // 3.进行比较
        if let Odate = date{
        //只有设置的 unites 才有对应的值
            let compts = calendar.components(unites, fromDate: Odate, toDate: NSDate(), options: [])
            // 2016-03-03 17:23:10 +0000 发布微博的时间
            // 2016-03-03 17:27:10 +0000 现在的时间
            // 现在的时间 - 发布微博的时间 
            
            // 4.通过 返回的值,就可以获取比较的大小
            printLog(compts.year)
            printLog(compts.month)
            printLog(compts.day)
            
            printLog(compts.hour)
            printLog(compts.minute)
            /*
            是今天
            
            1分钟之内 显示 "刚刚"
            
            1小时之内 显示 "xx分钟前"
            
            其他 显示 "xx小时前"
            
            是昨天 显示 "昨天 HH:mm"
            
            其他 显示 "MM-dd HH:mm"
            */
            if compts.year == 0 {
                //今年
                if compts.month == 0 { // ==0 是这个月
                
                    if compts.day == 0{ // 今天
                    
                        if compts.hour == 0{ // 1小时之内
                        
                            if compts.minute == 0{ // 刚刚
                                
                                return "刚刚"
                            }else { // 几分钟之前
                                return "\(compts.minute)分钟前"
                            }
                            
                        } else { // 1小时之外
                            return "\(compts.hour)小时前"
                        }
                        
                    } else if compts.day == 1 { // 昨天
                        // 几点几分  2016-03-04 09:50:27
                    
                        
                        formatter.dateFormat = "HH:mm"
                        let str = formatter.stringFromDate(Odate)
                        return "昨天 \(str)"
                    }
                    
                } else {
                    // 其他月 "MM-dd HH:mm"
                    formatter.dateFormat = "MM-dd HH:mm"
                    let str = formatter.stringFromDate(Odate)
                    return "昨天 \(str)"
                }
            } else {
                //其他年 "MM-dd HH:mm"
                formatter.dateFormat = "MM-dd HH:mm"
                let str = formatter.stringFromDate(Odate)
                return "昨天 \(str)"
            }
            
        }
        
        
        
        return "\(date)"
    }
    
    /*
    1.我们的需求是 通过 [酷] -> 对应的表情
    2.通过NSTextAttachment转换成 NSAttributeString
    3.赋值contentLabel.attribute
    */
    /*
    
        1. 先得一个一个找到 [酷]
        2. 找到之后,替换
    */
    
    /*
        正则表达式
    
        . 匹配任意字符，除了换行
    
        () 锁定要查找的内容
    
        * 匹配任意长度的内容
    
        ？尽量少的匹配
        
        //[] 是正则表达式保留字，在使用时，需要使用转义 \\
    
    
    
    */
    
    
    
    func getAttributeString(status: String) -> NSAttributedString?{
    
//        let status = "我今天遇到了一个很难解决的问题怎么办啊?[doge][doge][doge]"
        // 进行一个正则的匹配
         //[] 是正则表达式保留字，在使用时，需要使用转义 \\
        // \\[.*?\\]
        let pattern = "\\[.*?\\]"
        
        // 1. 创建一个匹配正则的表达式
        /*
            第一个参数: 正则表达式
        
        */
        
        /* throws
            try 的使用方法 -- 针对有异常抛出的方法来使用 try 距离  public init(pattern: String, options: NSRegularExpressionOptions) throws
            1. 默认try -- 需要用 do { throws 方法} catch {}
            2. try? & try!
        */
        
//        let ex = try? NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions(rawValue: 0))
//        let expre = try! NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions(rawValue: 0)) //  如果你用强try,这行代码如果出现问题,会崩溃
        
        do {
        
          let   expression = try NSRegularExpression(pattern: pattern, options: [])
            
            
            // 2. 字符串里区查找
            /*
            第一个参数: 查找的字符串
            第三个参数: 查找字符串的范围
            */
            let results = expression.matchesInString(status, options: [], range: NSMakeRange(0, status.characters.count))
            
            
            //定义一个 NSMutableAttributedString 来接收 处理的 AttributeString
            let attribute = NSMutableAttributedString(string: status)
            
            var count = results.count
            // 让 count 自减, 从后往前遍历
            while count-- > 0{
                
                let result = results[count]
                
                let subStr = (status as NSString).substringWithRange(result.range)
                
                // 查找表情
                if let emoticon = searchEmoticon(subStr) {
                    
                    // 获取NSTextAttacement
                    let attachment = NSTextAttachment()
                    
                    //设置图片
                    let imagePath = "\(emoticon.path!)/\(emoticon.png!)"
                    
                    attachment.image = UIImage(named: imagePath)
                    //设置图片的大小
                    let lineHeight = UIFont.systemFontOfSize(16).lineHeight
                    
                    attachment.bounds = CGRectMake(0,-4,lineHeight,lineHeight)
                    // 把图片放置到 attribute
                    let imageAttribute = NSAttributedString(attachment: attachment)
                    
                    /*
                    attribute
                    
                    */
                    //设置文字大小
                    attribute.addAttributes([NSFontAttributeName: UIFont.systemFontOfSize(16)], range: NSMakeRange(0, attribute.length))
                    
                    // 每处理一个表情,都需要替换
                    attribute.replaceCharactersInRange(result.range, withAttributedString: imageAttribute)
                    
                    
                }

                
            }
             return attribute
        }catch {
           print(error)
        }
        
        return nil
        
    }
    

    func searchEmoticon(chs: String) -> CZEmoticon?{
        
        // 通过去便利,包里的表情,来查找到对应的 表情
        
        // 在 默认表情包里查找
        for emoticon in CZEmoticonManager.defaultEmoticons{
            
            
            if emoticon.chs == chs{
                print("找到了")
                return  emoticon
            }
        }
        // 在浪小花里查找
        for emoticon in CZEmoticonManager.lxhEmoticons{
            
            
            if emoticon.chs == chs{
                print("找到了")
                return  emoticon
            }
        }
        
        return nil
    }
   
    

}
